/**
 * 抽象类
 * 抽象描述一种抽象的状态，无法被实例化，只能被继承
 * 抽象方法不能在抽象类中实现，只能在子类中实现，而且必须实现
 */

 abstract class Animal{
   name: string;
   abstract speak():void
 }
 class Cat extends Animal{
   speak(): void {
     throw new Error("miaomiaomiao ");
   }
 }
 let cat = new Cat();
 cat.speak();
 class Dog extends Animal{
  speak(): void {
    throw new Error("wangwang");
  }
}
let dog = new Dog();
dog.speak();
 /**
  * 修饰符
  * 访问控制修饰符 private protected public
  * 只读 readonly 用在编译阶段
  * 静态属性 static
  * 抽象类 抽象方法 abstract
  */

  /**
   * 重写和重载
   * 重载：为一个函数提供多个类型定义，或者函数声明
   * 重写：多个子类以不同的方式实现父类的方法:如上面，cat和dog重写animal的speak方法
   */

   /**
    * 继承和多态：extends体现继承，子类同一个方法表现不同体现多态
    */